'''
Description: 
Author: HowsenFisher
Date: 2021-04-12 09:52:30
LastEditTime: 2021-04-12 16:04:15
LastEditors: liutq
Reference: 
'''
import socket
import time
import cv2
import numpy

class VideoReceiver:
    def __init__(self,parent,ip,port):
        self.parent = parent
        # self.parent.newInfoSignal.emit("初始化视频接收器")
        self.ip = ip
        self.port = port
        # socket.AF_INET：服务器之间网络通信
        # socket.SOCK_STREAM：流式socket , for TCP
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 将套接字绑定到地址, 在AF_INET下,以元组（host,port）的形式表示地址.
        self.s.bind((self.ip,self.port))
        # 开始监听TCP传入连接。参数指定在拒绝连接之前，操作系统可以挂起的最大连接数量。该值至少为1，大部分应用程序设为5就可以了。
        self.s.listen(1)
        while True:
            self.ReceiveVideo()
            self.parent.voiceStopSignal.emit()
    
    def recvall(self,sock, count):
        buf = b''  # buf是一个byte类型
        while count:
            # 接受TCP套接字的数据。数据以字符串形式返回，count指定要接收的最大数据量.
            newbuf = sock.recv(count)
            if not newbuf:
                return None
            buf += newbuf
            count -= len(newbuf)
        return buf

    def ReceiveVideo(self):
        # 接受TCP连接并返回（conn,address）,其中conn是新的套接字对象，可以用来接收和发送数据。addr是连接客户端的地址。
        # 没有连接则等待有连接
        conn, addr = self.s.accept()
        print('connect from:'+str(addr))
        if self.parent.isCongJi:
            self.parent.CongJiVideoSignal.emit(addr[0])

        count = 0
        start = time.time()  # 用于计算帧率信息
        fps = 9999
        while True:
            start = time.time()  # 用于计算帧率信息
            length = self.recvall(conn, 16)  # 获得图片文件的长度,16代表获取长度
            stringData = self.recvall(conn, int(length))  # 根据获得的文件长度，获取图片文件
            data = numpy.frombuffer(stringData, numpy.uint8)  # 将获取到的字符流数据转换成1维数组
            decimg = cv2.imdecode(data, cv2.IMREAD_COLOR)  # 将数组解码成图像

            # 计算帧率
            if count == 3:
                count=0
                end = time.time()
                seconds = end - start
                try:
                    fps = (3/seconds)
                except Exception:
                    pass
                start = end
                
            else:
                count+=1

            cv2.putText(decimg, str(int(fps)), (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
            cv2.imshow('SERVER', decimg)  # 显示图像

            # 将帧率信息回传，主要目的是测试可以双向通信
            
            conn.send(bytes(str(int(fps)), encoding='utf-8'))
            # 点击小写字母q 退出程序
            if cv2.waitKey(1) == ord('q'):
                cv2.destroyAllWindows()
                return

        # self.s.close()
        # cv2.destroyAllWindows()


if __name__ == '__main__':
    myVideoReceiver = VideoReceiver("0.0.0.0",913)
